package com.share.order.config;

import lombok.extern.slf4j.Slf4j;
import org.springframework.amqp.core.Binding;
import org.springframework.amqp.core.BindingBuilder;
import org.springframework.amqp.core.CustomExchange;
import org.springframework.amqp.core.Queue;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;

import java.util.HashMap;
import java.util.Map;

@Slf4j
@Configuration
public class DelayedMqConfig {
    // 延迟交换机名称
    public static final String exchange_delay = "exchange.delay";
    // 延迟消息路由键
    public static final String routing_delay = "routing.delay";
    // 延迟队列名称
    public static final String queue_delay_1 = "queue.delay.1";

    /**
     * 声明延迟队列
     * 这是一个普通的持久化队列，用于接收延迟后的消息
     *
     * @return 延迟队列实例
     */
    @Bean
    public Queue delayQueue1() {
        log.info("创建延迟队列: {}", queue_delay_1);
        // 参数说明：队列名称、是否持久化（true表示重启后队列依然存在）
        return new Queue(queue_delay_1, true);
    }

    /**
     * 声明延迟交换机
     * 使用RabbitMQ的x-delayed-message类型交换机实现延迟功能
     * 需要配合rabbitmq_delayed_message_exchange插件使用
     *
     * @return 延迟交换机实例
     */
    @Bean
    public CustomExchange delayExchange() {
        Map<String, Object> args = new HashMap<>();
        // 指定延迟交换机的底层类型为direct（直接匹配路由键）
        args.put("x-delayed-type", "direct");

        log.info("创建延迟交换机: {}", exchange_delay);
        // 参数说明：交换机名称、交换机类型（x-delayed-message表示延迟交换机）
        // 是否持久化、是否自动删除、附加参数
        return new CustomExchange(exchange_delay, "x-delayed-message", true, false, args);
    }

    /**
     * 绑定延迟队列和延迟交换机
     * 建立队列与交换机之间的关联关系，通过指定的路由键进行消息转发
     *
     * @return 绑定关系实例
     */
    @Bean
    public Binding delayBinding1() {
        log.info("将队列 {} 通过路由键 {} 绑定到延迟交换机 {}", queue_delay_1, routing_delay, exchange_delay);
        // 将延迟队列通过指定路由键绑定到延迟交换机
        return BindingBuilder.bind(delayQueue1()).to(delayExchange()).with(routing_delay).noargs();
    }
}
